﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Xml.Serialization;

namespace ArgusLight.Fractals2D.ComplexFractalColoring.IterationBased
{
	[XmlType(TypeName="ComplexIterationBasedColoring")]
	public abstract class Coloring : ComplexFractalColoring.Coloring
	{
		public static byte[] GetColorBytes_2(Int32 i, Int32 MaxI)
		{
			if (i >= MaxI || i < 1)
				return new byte[] { 0, 0 };

			byte a = 0;
			byte b = 0;
			if (i < 16)
				a = (byte)((i) * 16 + 15);
			else
			{
				if (i < 11)
					a = (byte)(i * 25);
				else
				{
					if (i > 4 * 16)
						i = i % (4 * 16);

					if (i < 16)
						a = (byte)((i + 1) * 16 - 1);
					else if (i < 2 * 16)
					{
						a = 255;
						i = i - 16;
						b = (byte)((i + 1) * 16 - 1);
					}
					else if (i < 3 * 16)
					{
						a = 255;
						i = i - 2 * 16;
						b = (byte)(255 - ((i + 1) * 16 - 1));
					}
					else if (i < 4 * 16)
					{
						i = i - 3 * 16;
						a = (byte)(255 - ((i + 1) * 16 - 1));
					}
				}
			}
			return new byte[] { a, b };
		}

		public static byte[] GetColorBytes_3(Int32 i, Int32 MaxI)
		{
			if (i >= MaxI || i < 1)
				return new byte[] { 0, 0, 0 };

			byte a, b, c;
			a = b = c = 0;

			if (i < 11)
				a = (byte)(i * 25);
			else
			{
				if (i > 8 * 16)
					i = i % (8 * 16);

				if (i < 16)
					a = (byte)((i + 1) * 16 - 1);
				else if (i < 2 * 16)
				{
					a = 255;
					i = i - 16;
					b = (byte)((i + 1) * 16 - 1);
				}
				else if (i < 3 * 16)
				{
					a = 255;
					i = i - 2 * 16;
					b = (byte)(255 - ((i + 1) * 16 - 1));
				}
				else if (i < 4 * 16)
				{
					i = i - 3 * 16;
					a = (byte)(255 - ((i + 1) * 16 - 1));
				}
				else if (i < 5 * 16)
				{
					i = i - 4 * 16;
					b = (byte)((i + 1) * 16 - 1);
				}
				else if (i < 6 * 16)
				{
					b = 255;
					i = i - 5 * 16;
					c = (byte)((i + 1) * 16 - 1);
				}
				else if (i < 7 * 16)
				{
					b = 255;
					i = i - 6 * 16;
					c = (byte)(255 - ((i + 1) * 16 - 1));
				}
				else if (i < 8 * 16)
				{
					i = i - 7 * 16;
					b = (byte)(255 - ((i + 1) * 16 - 1));
				}
			}
			return new byte[] { a, b, c };
		}
	}
}
